
m:-	assert(preferenza(chiese,1)),
	assert(preferenza(musei,1)),
	assert(preferenza(giardini,1)),
	assert(preferenza(palazzi,1)),
	assert(preferenza(piazze,1)),
	assert(preferenza(castelli,1)),
	assert(piacerePasseggiare(1)),
	assert(oreVisita(3)),
	%%assert(evento(1)),
	%%assert(evento(2)),
	assert(periodo([19,11,2004],[19,11,2004])).


a:-

	assert(evento(0)),
	retract(evento(0)),
	assert(giorno(0)),
	bagMax(idSiti,ID),
	assert(idv(ID)),	
	assert(idc(0)),
	assert(collegamento(0,0,0)),
	retract(collegamento(0,0,0)),
	assert(area(0,[0,0,0])),
	retract(area(0,[0,0,0])),
	parametri.

r:-
	retractall(preferenza(_,_)),
	retractall(piacerePasseggiare(_)),
	retractall(oreVisita(_)),
	retractall(evento(_)),
	%%retractall(periodo(_,_)),
	retractall(trx(_)),
	retractall(scala(_)),
	retractall(lmax(_)),
	retractall(deltaL(_)),
	retractall(dimensioniMappa(_,_)),
	retractall(tx(_,_)),
	retractall(tTot(_,_)),
	retractall(api(_)),
	retractall(idv(_)),
	retractall(area(_,_)),
	retractall(giorni(_)),
	retractall(giorno(_)),
	retractall(areeGiorno(_,_)),
	retractall(eventiGiorno(_,_)),
	retractall(percorso(_,_)),	
	retractall(idc(_)),
	retractall(collegamentiGiorno(_,_)),
	retractall(collegamento(_,_,_)),
	retractall(collegamento(_,_)),
	retractall(sitiSelezionati(_)).
	

/* CAOCOLO DEI PARAMETRI DI INTERESSE IN BASA AL PROFILO UTENTE */

parametri:-
	
	/* Trx */
	piacerePasseggiare(P),
	oreVisita(O),
	(P==0   -> Trx is 12
		; (P==1 -> (O>4 -> Trx is 36
				;  Trx is 24)
			;  (O>4	-> Trx is 60
				;  Trx is 48)
		  )
	),
	
	/* Scala */
	Scala is 140,

	/* Lmax */	
	Lmax is floor(/(*(Scala,Trx),30)),

	/* DeltaL */
	DeltaL is floor(/(Trx,6)),
	
	/* Dimensioni Mappa */
	X=640,
	Y=570,

	assert(trx(Trx)),
	assert(scala(Scala)),
	assert(lmax(Lmax)),
	assert(deltaL(DeltaL)),
	assert(dimensioniMappa(X,Y)).


/*************** PREDICATI AUSILIARI ******************/

min(X,Y,Min):-
	X<Y->Min=X;Min=Y.

max(X,Y,Max):-
	X>Y->Max=X;Max=Y.	


:-hilog minimum.
	minimum(X,Y,Z):- X@=<Y -> Z=X ; Z=Y.

:-hilog maximum.
	maximum(X,Y,Z):- X@=<Y -> Z=Y ; Z=X.

:-hilog sum.
	sum(X,Y,Z):- Z is X+Y.

:-hilog idSiti.
	idSiti(ID):-siti(ID,_,_,_,_,_,_,_).


/* IDENTIFICATIVO PER LA CREAZIONE DI UNA NUOVA AREA */
idArea(ID):-
	idv(IDV),
	ID is +(IDV,1),
	retract(idv(IDV)),
	assert(idv(ID)).


/* CREAZIONE DI UN AREA CHE CIRCOSCRIVE UN SITO */
/* Dato l'ID di un sito ritorna l'area del  sito */	
sito2area(IdS,IdA):-
	siti(IdS,_,_,_,_,Sx,Sy,_),
	((area(IdA,[Sx,Sy,0]),!);
	 (idArea(IdA),assert(area(IdA,[Sx,Sy,0])),assert(tx(IdA,0)),assert(percorso(IdA,[IdS])))
	).


/* CONTROLLA SE IL PUNTO S APPARTIENE ALL'AREA A */
inArea(S,IdA):-
	area(IdA,[Ax,Ay,Ad]),
	S=[Sx,Sy],
	Sx>=Ax,Sx=<Ax+Ad,
	Sy>=Ay,Sy=<Ay+Ad.


/* VERIFICA SE V E' UN ESTREMO DELL'AREA A */
estremo(V,IdA):-	
	area(IdA,[Ax,Ay,Ad]),
	((Vx is Ax,Vy is Ay);
	 (Vx is +(Ax,Ad),Vy is Ay);
	 (Vx is Ax,Vy is +(Ay,Ad));
	 (Vx is +(Ax,Ad),Vy is +(Ay,Ad))),
	V=[Vx,Vy].


/* VERIFICA SE L'AREA A HA UN ESTREMO NELL'AREA B */
estremoIn(A,B):-		
	estremo(V,A),
	inArea(V,B).


/* VERIFICA SE LE AREE A E B SI INTERSECANO */
interseca(A,B):-
	once(estremoIn(A,B));
      	once(estremoIn(B,A)).


/* VERIFICA SE L'AREA A INTERSECA QUALCHE AREA DELLA LISTA API */
intersezione(A,API):-
	member(B,API),
	interseca(A,B).	


/* L RAPPRESENTA LA LISTA DEI SITI CHE SI TROVANO NELL'AREA A */
sitiIn(A,L):-	
	findall(IdS,(siti(IdS,_,_,_,_,X,Y,N),N>0,inArea([X,Y],A)),L).


/* L RAPPRESENTA LA LISTA DEI SITI DI INTERESSE CHE SI TROVANO NELL'AREA A */
sitiInteresseIn(A,L):-	
	findall(IdS,(siti(IdS,_,T,_,_,X,Y,N),N>0,inArea([X,Y],A),preferenza(T,P),P>0),L).


/* D RAPPRESENTA LA DISTANZA TRA LE AREE A E B */
distanzaAree(A,B,D):-
	area(A,[Ax,Ay,Ad]),
	area(B,[Bx,By,Bd]),
	X1 is abs(+(Ax,/(Ad,2))),
	Y1 is abs(+(Ay,/(Ad,2))),
	X2 is abs(+(Bx,/(Bd,2))),
	Y2 is abs(+(By,/(Bd,2))),
	X is abs(X2-X1),
	Y is abs(Y2-Y1),
	(X==0->D1 is 0;D1 is X*X),
	(Y==0->D2 is 0;D2 is Y*Y),
	D is floor(sqrt(D1+D2)).


/* ELIMINAZIONE DELL'AREA A */
rimuoviArea(A):-
	retract(area(A,_)),
	(retract(tx(A,_));!),
	(retract(percorso(A,_));!),
	(retract(tTot(A,_));!).


/*VALORE MASSIMO IN UN ARRAY*/
massimo(L,Max,Pos):-
	length(L,N),
	I=1,
	N>0,
	selMax(L,I,Max,Pos).

selMax(L,I,Max,Pos):-
	length(L,N),
	I=N,
	ith(I,L,Max),
	Pos is I.	

selMax(L,I,Max,Pos):-
	length(L,N),
	I<N,
	J is I+1,
	selMax(L,J,M,P),
	ith(I,L,M1),
	(M1>M->
		(Max is M1,Pos is I)
		;
		(Max is M, Pos is P)
	).

sottoSequenza(S,I,J,SSij):-
	length(S,N),
	N>0,
	I>=1,
	J=<N,
	selSottoSequenza(S,I,J,SSij).

sottoSequenza(S,I,J,SSij):-
	length(S,N),
	(N=0;J>N;I<1),
	SSij=[].


selSottoSequenza(S,I,J,SSij):-
	I=<J,
	ith(I,S,X),
	K is I+1,
	selSottoSequenza(S,K,J,SSkj),
	append([X],SSkj,SSij).

selSottoSequenza(_,I,J,SSij):-
	I>J,
	SSij=[].
